#ifndef RULEMANAGER_H
#define RULEMANAGER_H

#include <QObject>
#include <QList>
#include <QFile>
#include <QJsonDocument>
#include "rule.h"

// 前向声明
class DatabaseManager;

/**
 * @brief 规则管理器类，用于管理和存储规则
 * 
 * 该类负责规则的添加、更新、删除、查询等管理功能，
 * 以及规则的持久化存储和分类管理。
 */
class RuleManager : public QObject
{
    Q_OBJECT
public:
    /**
     * @brief 构造函数
     * @param parent 父对象，默认为nullptr
     */
    explicit RuleManager(QObject *parent = nullptr);

    // 规则管理功能
    
    /**
     * @brief 添加规则
     * @param rule 要添加的规则
     */
    void addRule(const Rule &rule);
    
    /**
     * @brief 更新规则
     * @param ruleName 要更新的规则名称
     * @param rule 更新后的规则
     */
    void updateRule(const QString &ruleName, const Rule &rule);
    
    /**
     * @brief 删除规则
     * @param ruleName 要删除的规则名称
     */
    void deleteRule(const QString &ruleName);
    
    /**
     * @brief 清空所有规则
     */
    void clearRules();
    
    /**
     * @brief 获取所有规则
     * @return 包含所有规则的列表
     */
    QList<Rule> getAllRules() const;
    
    /**
     * @brief 根据名称获取规则
     * @param ruleName 规则名称
     * @return 匹配的规则，如果不存在则返回空规则
     */
    Rule getRuleByName(const QString &ruleName) const;

    // 持久化功能
    
    /**
     * @brief 将规则保存到文件
     * @param filename 文件名
     * @return 如果保存成功则返回true，否则返回false
     */
    bool saveRulesToFile(const QString &filename) const;
    
    /**
     * @brief 从文件加载规则
     * @param filename 文件名
     * @return 如果加载成功则返回true，否则返回false
     */
    bool loadRulesFromFile(const QString &filename);
    
    // 数据库功能
    
    /**
     * @brief 设置数据库管理器
     * @param dbManager 数据库管理器指针
     */
    void setDatabaseManager(DatabaseManager *dbManager);
    
    /**
     * @brief 从数据库加载规则
     * @return 如果加载成功则返回true，否则返回false
     */
    bool loadRulesFromDatabase();

    // 规则分类管理
    
    /**
     * @brief 获取所有规则类别
     * @return 包含所有规则类别的字符串列表
     */
    QStringList getRuleCategories() const;
    
    /**
     * @brief 根据类别获取规则
     * @param category 规则类别名称
     * @return 属于指定类别的规则列表
     */
    QList<Rule> getRulesByCategory(const QString &category) const;
    
    /**
     * @brief 将规则添加到指定类别
     * @param rule 要添加的规则
     * @param category 规则类别名称
     */
    void addRuleToCategory(const Rule &rule, const QString &category);

signals:
    /**
     * @brief 规则变化信号
     */
    void rulesChanged();

private:
    QList<Rule> m_rules;         ///< 存储所有规则的列表
    DatabaseManager *m_dbManager; ///< 数据库管理器指针
};

#endif // RULEMANAGER_H